package com.lyl.projectspringboot.util;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;

public class JwtUtil {
    //设置 JWT过期时间 为24小时，单位毫秒
    private static final long EXPIRE_TIME = 1000 * 60 * 60 * 24;
    //32位密钥
    private static final String JWT_KEY = "abcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd";

    /**
     * 定义用于JWT（JSON Web Token）签名的密钥
     * 该密钥是使用HMAC SHA算法生成的，用于确保JWT的安全性
     * Keys.hmacShaKeyFor方法将JWT_KEY转换为适用于HMAC SHA算法的密钥
     */
    private static final SecretKey JWT_KEY_SECRET = Keys.hmacShaKeyFor(JWT_KEY.getBytes());

    //生成token
    public static String createToken(String username, String password) {
        //获取当前实践
        Date now = new Date();
        //设置过期时间
        Date expireDate = new Date(now.getTime() + EXPIRE_TIME);

        // 创建JWT生成器实例
        return Jwts.builder()

                // 配置JWT头部信息
                .header().add("typ", "JWT").and()
                // 设置JWT的发行者
                .issuer("lyl")
                // 设置JWT的签发时间
                .issuedAt(now)
                // 设置JWT的过期时间
                .expiration(expireDate)
                // 添加自定义声明
                .claim("username", username)
                .claim("password", password)
                // 使用HS256算法和密钥签名JWT
                .signWith(SignatureAlgorithm.HS256, JWT_KEY_SECRET)
                // 构建并返回JWT字符串
                .compact();
    }

    //解析token

    /**
     * 根据Token获取Claims信息
     * 该方法主要用于解析Token，并提取其中的Claims信息
     * Claims信息包含了Token中的所有自定义声明，如用户ID、用户名等
     *
     * @param token 用户Token，用于身份验证和授权
     * @return Claims对象，包含Token中的所有声明
     */
    public static Claims getClaimsByToken(String token) {
        // 使用JWT_KEY_SECRET密钥初始化解析器
        return Jwts.parser()
                .verifyWith(JWT_KEY_SECRET)
                .build()
                // 解析Token并获取签名的Claims
                .parseSignedClaims(token)
                .getPayload();
    }

}
